#ifndef Map_h
#define Map_h

#include "SingleList.h"
#include "String.h"


namespace TL {
    template<class T> class Map {
    protected:
        SingleList<String> m_Keys;
        SingleList<T> m_Values;

    public:
        Map()
        {
        }
        Map(const Map &map)
        {
            m_Keys = map.m_Keys;
            m_Values = map.m_Values;
        }
        ~Map()
        {
        }

        T &Find(String key)
        {
            for (int i = 0; i < m_Keys.Size(); i++) {
                if (m_Keys[i] == key) {
                    return m_Values[i];
                }
            }

            return m_Values.At(-1);
        }
        const T &Find(String key) const
        {
            for (int i = 0; i < m_Keys.Size(); i++) {
                if (m_Keys[i] == key) {
                    return m_Values[i];
                }
            }

            return m_Values.At(-1);
        }
        T &GetByIndex(int index)
        {
            return m_Values.At(index);
        }
        const T &GetByIndex(int index) const
        {
            return m_Values.At(index);
        }
        void Insert(String key, const T &value)
        {
            m_Keys.Insert(key);
            m_Values.Insert(value);
        }
        void Remove(String key)
        {
            for (int i = 0; i < m_Keys.Size(); i++) {
                if (m_Keys[i] == key) {
                    m_Keys.Remove(i);
                    m_Values.Remove(i);

                    break;
                }
            }
        }
        int Size() const
        {
            return m_Keys.Size();
        }

        Map &operator=(const Map &map)
        {
            m_Keys = map.m_Keys;
            m_Values = map.m_Values;

            return *this;
        }
    };
}

#endif
